﻿using System;
using WebMatrix.WebData;
using System.Web.Security;
using System.Linq;
using System.Collections.Generic;
using System.Web;
using PmSadis.Repositories.Abstract;

namespace PmSadis.WebFormsUi
{
    public class Global : System.Web.HttpApplication
    {
        protected void Application_Start(object sender, EventArgs e)
        {
            WebSecurity.InitializeDatabaseConnection("UsersContext", "D_USERS", "USER_ID", "USER_NAME", true);
            var roles = new string[] { "Администратор", "Оператор", "Куратор", "Пользователь" }.ToList();
            roles.ForEach(x =>
            {
                if (!Roles.RoleExists(x))
                    Roles.CreateRole(x);
            });
            /*Сгенерировать месяцы*/
            GenerateMonth();
        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// Сгенерировать месяцы
        /// <remarks>
        /// Чтобы сгенерировать месяцы при заполненной таблице месяцев
        /// необходимо удалить все записи прежде.
        /// При заполненной таблице месяцев генерация производиться не будет
        /// </remarks>
        /// </summary>
        private void GenerateMonth()
        {
            var caheMonthes = HttpContext.Current.Cache["cache-monthes"] != null
                ? HttpContext.Current.Cache["cache-monthes"] as List<PmSadis.Models.Month>
                : new List<PmSadis.Models.Month>();

            var existMonthesCount = caheMonthes.Count;
            if (existMonthesCount == 0)
            {
                var repo = new PmSadis.Repositories.MonthRepository();
                var existingMonthes = repo.All;
                if (existingMonthes.Count() > 0)
                {
                    HttpContext.Current.Cache["cache-monthes"] = existingMonthes.ToList();
                    return;
                }

                var endDay = PmSadis.Providers.AppSettings.EndDayMonth;
                var startDate = PmSadis.Providers.AppSettings.StartDate;
                var endDate = PmSadis.Providers.AppSettings.EndDate;
                if (endDate < startDate)
                    throw new Exception("В конфигурационном файле \"endDate\" должен быть больше параметра \"startDate\"");
                var monthes = endDate.Subtract(startDate).Days / (365.25 / 12);
                var monthesCount = (int)Math.Ceiling(monthes);
                var results = new List<PmSadis.Models.Month>();

                var genMonth = new DateTime(startDate.Year, startDate.Month, endDay).AddMonths(1);
                int i = 0;
                while (i < monthesCount)
                {
                    results.Add(new PmSadis.Models.Month
                    {
                        Number = genMonth.Month,
                        Year = genMonth.Year,
                        Name = genMonth.ToString("MMMM")
                    });
                    genMonth = new DateTime(genMonth.Year, genMonth.Month, endDay).AddMonths(1);
                    i++;
                }
                if (results.Count != 0)
                {
                    results.ForEach(x =>
                    {
                        repo.Edit(x);
                    });
                }

                results = repo.All.ToList();
                HttpContext.Current.Cache["cache-monthes"] = results;
            }
        }
    }
}